package com.web.pay_service.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.web.pay_service.client.TradeClient;
import com.web.pay_service.pojo.Order;
import com.web.pay_service.service.OrderService;
import com.websecondhand.R;
import com.websecondhand.utils.JwtUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.time.LocalDateTime;
import java.util.List;

@RestController
@RequestMapping("/trade")
public class TradeController {

    @Autowired
    TradeClient tradeClient;

    @Autowired
    OrderService orderService;

    //生成订单
    /*
        此处代码的逻辑:
          1. 首先做一个token的验证 看用户是否登录 获取购买者的信息
          2. 生成一个新的订单 设置对应的属性
          3. 远程调用下架物品
          4. 生成订单 并返回订单的id
     */
    @PostMapping("/createorders/{itemID}")
    public R createOrders(@RequestParam("price")Double price,
                          @RequestParam("uid")Integer uid2,
                          @RequestParam("description")String description,
                          @PathVariable("itemID")Long itemID,
                          HttpServletRequest request)
    {
        // 生成订单之前做一个token的验证
        Integer uid1 = JwtUtils.getUid(request);

        Order order=new Order();
        order.setCreateTime(LocalDateTime.now());
        order.setState(0);
        order.setFinishTime(null);
        order.setPrice(price);
        order.setUid1(uid1);
        order.setUid2(uid2);
        order.setDescription(description);
        order.setItemid(itemID);

        // 下架物品
        // 远程调用
        tradeClient.soldoutItem(itemID);

        // 保存订单
        orderService.save(order);

        return R.ok().addData("orderID", order.getOrderId());
    }

    // 确认交易是否完成
    // 该模块只能由用户去完成
    // 1. 首先验证token是否登录
    // 2. 根据orderID进行订单状态的获取
    @GetMapping("/finishtrade/{orderID}")
    public R finishTrade(@PathVariable("orderID")Long orderID,
                         HttpServletRequest request)
    {
        // 首先从token中取出uid
        JwtUtils.getUid(request);

        // 无需验证orderID 是否存在 前端发过来即可
        Order order = orderService.getById(orderID);

        order.setFinishTime(LocalDateTime.now());
        // 1 代表已完成
        order.setState(1);

        UpdateWrapper<Order> updateWrapper=new UpdateWrapper<>();

        updateWrapper.eq("order_id", order.getOrderId());

        orderService.update(order, updateWrapper);

        return R.ok();
    }


    // 撤销交易
    // 只有卖家可以撤销交易 一旦交易完成就不可撤销
    @GetMapping("/withdrawtrade/{orderID}")
    public R withdrawTrade(@PathVariable("orderID")Long orderID)
    {
        // 直接将记录中的状态设置就可以
        Order order = orderService.getById(orderID);

        // 状态为2 代表该条记录已撤销
        order.setState(2);

        // 远程调用
//        tradeClient.putawayItem(order.getItemid());

        return R.ok();
    }

    // 查询用户所有的交易记录
    // state 是状态
    // 0 代表或得所有未交易的记录 即自己上架的物品
    // 1 代表获得所有成功的交易
    // 2 代表获得所有撤销的交易
    @GetMapping("/trade/getallbuylog/{page}/{size}/{state}")
    public R getBuyLog(@PathVariable("page")Integer page,
                       @PathVariable("size")Integer size,
                       @PathVariable("state")Integer state,
                       HttpServletRequest request)
    {
        Integer uid = JwtUtils.getUid(request);

        Page<Order> page1=new Page<>(page,size);

        //1.获取上架的物品
        if (state==0)
        {
            // 条件: 状态为0 完成时间为空 uid2相等
            QueryWrapper<Order> queryWrapper=new QueryWrapper<>();
            queryWrapper.eq("state", "0");
            queryWrapper.isNull("finish_time");
            queryWrapper.eq("uid2", uid);

            Page<Order> orderPage = orderService.page(page1, queryWrapper);

            List<Order> records = orderPage.getRecords();

            return R.ok().addData("orderlogs",records);
        }

        //2.获取所有成功的交易
        else if (state==1)
        {
            // 条件: 状态为1 完成时间不为空 uid1或者uid2相等
            QueryWrapper<Order> queryWrapper=new QueryWrapper<>();
            queryWrapper.eq("state", "1");
            queryWrapper.isNotNull("finish_time");
            queryWrapper.eq("uid2", uid).or().eq("uid1", uid);

            Page<Order> orderPage = orderService.page(page1, queryWrapper);

            List<Order> records = orderPage.getRecords();

            return R.ok().addData("orderlogs",records);
        }

        // 获得所有撤销的交易
        else
        {
            QueryWrapper<Order> queryWrapper=new QueryWrapper<>();
            queryWrapper.eq("state", "2");
            queryWrapper.eq("uid2", uid).or().eq("uid1", uid);

            Page<Order> orderPage = orderService.page(page1, queryWrapper);
            List<Order> records = orderPage.getRecords();

            return R.ok().addData("orderlogs",records);
        }

    }

}
